package william.xor;

/**
 * @author ZhangShenao
 * @date 2024/1/19
 * @description <a href="https://leetcode.cn/problems/single-number/description/">...</a>
 */
public class Leetcode136_只出现一次的数字 {
    /**
     * 利用异或的性质
     * 对数组中的每个元素依次进行异或
     * 基于异或的性质,出现偶数次的元素异或后结果为0,会互相抵消
     * 最后异或的结果就是出现奇数次的元素
     */
    public int singleNumber(int[] nums) {
        //边界条件校验
        if (nums == null || nums.length < 1) {
            throw new RuntimeException("illegal input!!");
        }

        //依次对数组中的每个元素进行异或
        int xor = 0;
        for (int i = 0; i < nums.length; i++) {
            xor ^= nums[i];
        }

        //根据异或操作的性质,出现偶数次的元素会互相抵消,最后异或的结果就是出现奇数次的元素
        return xor;
    }
}
